#ifndef __FLASH_ON_CHIP_H
#define __FLASH_ON_CHIP_H
#include <stdio.h>
#include <string.h>
#include <stdint.h>
/*===============================================
 * STM32F103C8T6 Flash 分区布局说明
 *-----------------------------------------------
 * Flash 总容量：64 KB (0x08000000 ~ 0x0800FFFF)
 * 单页大小：1 KB (PAGE_SIZE = 1024)
 *
 * 分区划分：
 *  ┌──────────────────────────────────────────┐
 *  │ Bootloader 区域 (16 KB)                 │ 0x08000000 - 0x08003FFF
 *  ├──────────────────────────────────────────┤
 *  │ 主程序区 APP (24 KB)                    │ 0x08004000 - 0x08009FFF
 *  ├──────────────────────────────────────────┤
 *  │ OTA 备用镜像区 (23 KB)                  │ 0x0800A000 - 0x0800FBFF
 *  ├──────────────────────────────────────────┤
 *  │ 标志页 Flag Page (1 KB)                 │ 0x0800FC00 - 0x0800FFFF
 *  └──────────────────────────────────────────┘
 *===============================================*/

#define PAGE_SIZE       	(1024U)				   // 每页 Flash 大小 = 1KB

/*-------------------- Bootloader 区域 --------------------*/
#define BOOT_START_ADDR     (0x08000000)           // Bootloader 起始地址（主 Flash 首地址）
#define BOOT_END_ADDR       (0x08004000)           // Bootloader 结束地址（不含此地址）
#define BOOT_SIZE           (16 * 1024)            // Bootloader 占用 16KB (0x4000)

/*-------------------- 应用程序 APP 区域 --------------------*/
#define APP_START_ADDR      (0x08004000)           // 应用程序起始地址
#define APP_END_ADDR        (0x0800A000)           // 应用程序结束地址（不含此地址）
#define APP_SIZE            (24 * 1024)            // APP 占用 24KB (0x6000)

/*-------------------- OTA 备用区 --------------------*/
#define OTA_START_ADDR      (0x0800A000)           // OTA 升级镜像存放区起始地址
#define OTA_END_ADDR        (0x0800FC00)           // OTA 结束地址（不含此地址）
#define OTA_SIZE            (23 * 1024)            // OTA 区占用 23KB (0x5C00)

/*-------------------- 标志页区域 --------------------*/
#define Flage_PAGE_ADDR 	(0x0800FC00)           // 最后一页(0x0800FC00~0x0800FFFF)，用于存放升级标志/校验信息


int flash_write(uint32_t addr, const uint8_t *data, uint32_t len);
int flash_erase(uint32_t addr, uint32_t len);
int flash_read(uint32_t addr, uint8_t *buf, uint32_t len);
#endif
